[AWS IoT Events] アクションで起動したLambdaに送られる、デフォルトのPayloadについて確認してみました
1 はじめに
CX事業本部の平内(SIN)です。
今回は、AWS IoT Events(以下、IoT Events)のアクションでLamdaを起動した場合に送られる、デフォルトのPayloadについて確認してみました。
今回、サンプルとしてイメージした探知機は、温度管理です。規定の温度を超えた場合に、アラートを発生させたいと考えています。
2 入力の作成
IoT Eventsの探知機では、入力を操作するために、予め、その型を定義しておく必要があります。
下記のようなjsonファイルをローカルに作成しておき、入力の作成を行います。
SampleDetectorModelInput.json
{ "deviceName": "", "temp" : "" }
入力名は、SampleDetectorModelInputとしました。
3 探知機モデルの作成
探知機モデルを作成します。
モデルは、2つの状態(Normal及び、Abnormal)とその間の相互の移行を定義しました。
4 移行イベント
相互のイベントトリガーロジックは、それぞれ下記のようになっており、tempの値が、50を超えるかどうかで、2つの状態を遷移するようになっています。
$input.SampleDetectorModelInput.temp > 50 $input.SampleDetectorModelInput.temp <= 50
5 Lambda
SampleDetectorModelFunctionという名前で、発火させるLambdaを作成します。
コードは、送られてきたペイロードを出力するだけの簡単なものです。
import json def lambda_handler(event, context): print(json.dumps(event))
6 遷移後のイベント
状態(Abnormal)のOnEnterにイベントを追加して、上記のLambdaを起動するように設定しました。
Lambdaに送られるPayloadは、デフォルトを選択しています。
7 発行
SampleDetectorModelという名前で、探知機を発行しています。
探知機生成メソッドは、一意のキー値ごとに探知機を生成するとし、deviceNameごとに探知機が生成されるようにしています。
8 サンプルデータの送信
通常、探知機へのメッセージは、IoT Coreのエンドポイントに到着したMQTTメッセージをルールでトリガーして、IoT Eventに送りますが、ここでは、テストとして、サンプルデータの送信を使用して、探知機を動作させて見ます。
設定した内容は以下のとおりです。
- 入力名:SampleDetectorModelInput
- ペイロード:
- deviceName: device001 文字列
- temp 40 番号
プレビュー画面からデータを送信するを押すと、探知機にメッセージが送られます。
ディテクターの一覧を見ると、temp:40としたので、device001 が、Normal状態のとなっていることが確認できます。
9 アラート発生
同じく「サンプルデータを送信」から、temp:60を送信してみると、device001 が、Abnormal状態に変化したことを確認できます。
また、Abnormalに遷移したので、OnEventからLambdaが発火して、ログが出力されていることを確認できます。
Lambdaに送られたペイロードを確認すると、payload.detector.detectorModelName及び、payload.state.stateNameで、どの探知機の何状態からの発火なのかが分かります。
また、payload.detector.keyValueに、deviceNameが入りますので、デバイス名も分かります。
しかし、異常となった原因、温度(temp)は、分かりません。
{ "eventTime": 1601680342294, "payload": { "actionExecutionId": "8287b53e-6b65-3f3c-81d2-c1d85565a6a6", "detector": { "detectorModelName": "SampleDetectorModel", "keyValue": "device001", "detectorModelVersion": "1" }, "eventTriggerDetails": { "inputName": "SampleDetectorModelInput", "messageId": "aab4fcbe-3d1c-40d2-822c-975a70c0e9b4", "triggerType": "Message" }, "state": { "stateName": "Abnormal", "variables": {}, "timers": {} } }, "eventName": "Alert" }
10 変数の設定
現在の移行イベント(toAbnormal)は、イベントトリガーのロジックしか設定されていませんが、ここに「変数の設定」アクションを追加し、tempの値を保存することにします。
前回と同じ要領で、Abnormalへの遷移を発生させ、Lambdaのログを確認すると、今度は、payload.stateにvariablesが増えており、保存した変数の値が入っていることが分かります。
11 最後に
今回は、IoT EventsでLambdaを発火させた場合の、デフォルトのPayloadについて確認してみました。
「変数の設定」を使用すると、ディテクターごとに、メッセージで送られて来た如何なる情報も保持することが可能です。
今回のような温度の探知機であれば、異常アラートに、「直近10回分の計測結果」とかを追加することも可能でしょう。
殆どコーディングなしで、ここまで出来てしまうマネージドサービスは、ホント凄いと思います。